package com.haiertvbic.tvnow.protocol;

import java.io.IOException;
import java.nio.ByteBuffer;

import com.haiertvbic.tvnow.common.Constant;
import com.haiertvbic.tvnow.model.FavChannelPagekage;
import com.haiertvbic.tvnow.model.LocalCodeBean;
import com.haiertvbic.tvnow.util.SLog;

public class CAEProtocol {
	private static final String TAG = "FavChannel";
	private static final String IP = "127.0.0.1";
//	private static final String IP = "192.168.200.96";
	/**
	 * 获取喜爱频道列表
	 * 
	 * @param type
	 *            查询类型 0：昨天的收视率 1：上周的收视率 2：上月的收视率
	 * @param num
	 *            查询的频道的数量
	 * @return 返回FavChannelPagekage类型 頻道和返回码标识的意思 4006000 成功 4006001
	 *         成功，但是数据库没有请求个数那么多的频道，正常情况很少出现 4006002 数据库不存在或丢失 4006003 操作数据库发生错误
	 *         4006004 未知错误，此种情况下UI可以重新请求 如果连接的ip有问题，会出现返回值为空。
	 * @throws Exception
	 */
	public static FavChannelPagekage getFavChannel(int type, int num) {
		FavChannelPagekage favchannels = null;
		try {
			// 组合发送用的数据包
			ByteBuffer data = PackageOperation.getTvChannelsFromCae(type, num,
					null);
			if (SocketPackage.getInstance()
					.createShortSocket(IP, 7204)) {
				SLog.d(TAG, "建立短链接");
				SocketPackage.getInstance().sendPacket(
						Constant.CMD_CAE_APP_GET_AUDIO_RATE, 0, data);
				SLog.d(TAG, "发送的获取频道列表的");
				SLog.d(TAG, "发送获取频道列表数据");
				favchannels = SocketPackage.getInstance()
						.getTvChannelsFromCae();
				SLog.d(TAG, "执行到获得频道列表数据");
			}
		} catch (IOException e) {
			// 和设备连接异常
			SLog.d(TAG, "没有获取到频道数据抛出异常");
			return null;
		} finally {
			if (SocketPackage.getInstance() != null) {
				SocketPackage.getInstance().closeSocket();				
			}
		}
		return favchannels;
	}

	/**
	 * 获取地域信息
	 * 
	 * @return 地域信息若返回码为4006300 成功否则4006301 失败
	 */
	public static LocalCodeBean getLocalCode() {
		LocalCodeBean LocalInfo = null;
		try {
			if (SocketPackage.getInstance()
					.createShortSocket(IP, 7204)) {
				// 组合发送用的数据包
				ByteBuffer data = PackageOperation.getDeviceLocalInfo();
				SocketPackage.getInstance().sendPacket(
						Constant.CMD_CAE_APP_GET_LOCAL_CODE, 0, data);
				LocalInfo = SocketPackage.getInstance().getDeviceLocalInfo();
				if (LocalInfo != null) {
					SLog.d(TAG, LocalInfo.getCity() + "");
					SLog.d(TAG, LocalInfo.getReturn_code()+ "");
					return LocalInfo;
				}else {
					SLog.d(TAG, "获取本地码失败");
					return null;
				}
			} else {
				return null;
			}

		} catch (IOException e) {
			e.printStackTrace();
			// 未知错误
			return null;
		} finally {
			if (SocketPackage.getInstance() != null) {
				SocketPackage.getInstance().closeSocket();
			}
		}
	}

	/**
	 * 电视换台的操作
	 * 
	 * @param thread
	 *            换台操作有可能阻塞线程或者用户会连续按换台键，所以要提供一个线程如果按多次就让线程休眠10s后执行
	 * @param channelId
	 *            换台频道的id
	 * @param channelNum
	 *            换成的频道号，扩充使用，可以为0
	 * @return 类型为int 0:读取换台信息失败 4004500:换台成功 4004501: 失败 ,此频道不存在 4004502:CRB
	 *         未插入，或者 CRB 故障 ， 提示用户插入或者重新插 拔 CRB 4004503 :未设置 CRB -2002连接断开
	 */
	public synchronized static int changeChannel(Thread thread, int channelId,
			int channelNum) {
		int responseCode = 0;
		try {
			if (SocketPackage.getInstance()
					.createShortSocket(IP, 7204)) {
				// 组合发送用的数据包
				ByteBuffer data = PackageOperation.getChangeChannelData(
						Constant.CONNECT_DEVICE_OTHER, channelId, channelNum);
				SocketPackage.getInstance().sendPacket(
						Constant.CMD_SENT_CHANNEL_INFO, 0, data);
				responseCode = SocketPackage.getInstance().tvCurrentChannel();

//				try {
//					thread.sleep(10000);
//				} catch (InterruptedException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
				return responseCode;

			} else {
				// 连接断开
				return -2002;
			}

		} catch (IOException e) {
			e.printStackTrace();
			return -2002;
		} finally {
			if (SocketPackage.getInstance() != null) {
				
			}
			SocketPackage.getInstance().closeSocket();
		}
	}
}
